#ifndef SESSION_MANAGER_H
#define SESSION_MANAGER_H

#include <memory>
#include <random>

#include "./SessionStorage.h" // 包含./Session.h
#include "../http/HttpRequest.h"
#include "../http/HttpResponse.h"

class SessionManager
{
public:
    explicit SessionManager(std::unique_ptr<SessionStorage> storage)
        : storage_(std::move(storage)), randomGen_(std::random_device{}()) {}

    // 从请求中创建或获取会话
    std::shared_ptr<Session> getSession(const HttpRequest &req, HttpResponse *res);
    void updateSession(std::shared_ptr<Session> session)
    {
        this->storage_->save(session);
    }
    void deleteSession(const std::string &id)
    {
        this->storage_->remove(id);
    }

    // 注意：这个实现依赖于具体的存储实现
    // 对于内存存储，可以在加载时检查是否过期
    // 对于其他存储的实现，可能需要定期清理过期会话
    void cleanExpiredSessions() {}

private:
    std::string getSessionIdFromRequestCookie(const HttpRequest &req);
    std::string generateSessionId();
    void setSessionIdToResponseCookie(const std::string &id, HttpResponse *res);

    std::unique_ptr<SessionStorage> storage_;
    std::mt19937 randomGen_; // 随机数生成器，用于生成会话id
};

#endif